#ifndef __LOG_H__
#define __LOG_H__

/*宏定义：四种打印等级的字符串字面值*/
#define STR_LEVEL_DEBUG     "LEVEL_DEBUG"
#define STR_LEVEL_INFO      "LEVEL_INFO"
#define STR_LEVEL_WARNING   "LEVEL_WARNING"
#define STR_LEVEL_ERROR     "LEVEL_ERROR"

#define KEY_LEVEL "LogLevel"

/*枚举类型：用于表明日志等级*/
typedef enum{
    LEVEL_DEBUG,    //调试
    LEVEL_INFO,     //普通    
    LEVEL_WARNING,  //警告
    LEVEL_ERROR     //错误
}Level;


/*声明全局变量g_log_level，用于表明日志打印等级*/
extern Level g_log_level;     // 默认为LEVEL_INFO等级


/*================================ 获取与设置等级 ================================*/
/*
 * 功能：获取当前配置文件中的日志等级,
 *       若配置文件中没有，则默认设置为LevelInfo，并写入配置文件
 * 成功返回：0
 * 失败返回：-1
 */
int logGetLevel(
    Level *ptr_level     // 用于接收当前日志等级等级(传入传出参数)
);


/*
 * 功能：更改需要打印的日志等级,并写入配置文件
 * 成功返回：0
 * 失败返回：-1
 */
int logSetLevel(
    Level level     // 想要修改为的等级(LevelInfo,LevelWarning,LevelError)
);


/*================================ level的类型转换 ================================*/
/*
 * 功能：把日志等级由字符串转换为LeveL类型
 * 成功返回：0
 * 失败返回：-1
 */
int logStrToLevel(
    const char *str_level,  // 想要修改的源字符串类型
    Level *ptr_level        // 用于获取转换得到的Level枚举类型（传入传出参数）
);


/*
 * 功能：把日志等级由LeveL类型转换为字符串类型
 * 成功返回：0
 * 失败返回：-1
 */
int logLevelToStr(
    Level level,            // 想要转换的源Level枚举类型
    char *str_level         // 用于获取转换得到的字符串类型（传入传出参数）
);


/*================================ 日志打印函数 ================================*/

/*
 * 功能：打印调试信息
 * 成功返回：0
 * 失败返回：-1
 */
int logDebug(
    const char *msg     // 用于传入需要补充的打印信息
);


/*
 * 功能：打印普通信息
 * 成功返回：0
 * 失败返回：-1
 */
int logInfo(
    const char *msg     // 用于传入需要补充的打印信息
);


/*
 * 功能：打印警告信息
 * 成功返回：0
 * 失败返回：-1
 */
int logWarning(
    const char *msg     // 用于传入需要补充的打印信息
);


/*
 * 功能：打印错误信息
 * 成功返回：0
 * 失败返回：-1
 */
int logError(
    const char *msg     // 用于传入需要补充的打印信息
);


/*
 * 功能：打印错误信息,并把perror的内容重定向打印到日志
 * 成功返回：0
 * 失败返回：-1
 */
int logErrorFunction(

);

#endif // !__LOG_H__
